﻿using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using SGAEntidades;
using System.Text;
using SGALogicaNegocio;

namespace webSGA
{
    public partial class wfReciboServicio : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {
                    lblUsuario.Text = Context.User.Identity.Name;
                    Util.Util.CargarTipoServicio(cboTipoRecibo, true);
                    Util.Util.CargarMoneda(cboMoneda, true);
                    Util.Util.CargarTipoLocal(cboTipoLocalConsulta, true);
                    hfAccion.Value = "N";
                }
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió un error: " + ex.Message, alertaError, alertaExito, lblError, lblExito);
            }
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            ActivarDesactivarCampos(true);
            LimpiarCampos();
            hfAccion.Value = "N";
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                MostrarModalConfirmacion();
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió el siguiente error: " + ex.Message, alertaError, alertaExito,
                                                  lblError, lblExito);
            }
        }

        private void MostrarModalConfirmacion()
        {
            var sb = new StringBuilder();
            sb.Append(@"<script type='text/javascript'>");
            sb.Append("$('#modalConfirmacion').modal('show');");
            sb.Append(@"</script>");
            ClientScript.RegisterStartupScript(GetType(), "Show", sb.ToString());
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "ModalScript", sb.ToString(), false);
        }

        protected void btnEditar_Click(object sender, EventArgs e)
        {
            ActivarDesactivarCampos(true);
            txtNroPago.Enabled = false;
            hfAccion.Value = "M";
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            if (hfAccion.Value.Equals("N"))
            {
                LimpiarCampos();
            }
            else
            {
                ActivarDesactivarCampos(false);
            }
        }

        protected void btnCerrarSesion_Click(object sender, EventArgs e)
        {
            FormsAuthentication.SignOut();
            Response.Redirect("Login.aspx");
        }

        private void ActivarDesactivarCampos(Boolean bEstado)
        {
            txtRecibo.Enabled = bEstado;
            cboTipoRecibo.Enabled = bEstado;
            txtFechaEmision.Enabled = bEstado;
            txtFechaVence.Enabled = bEstado;
            txtFechaRecepcion.Enabled = bEstado;
            txtSubTotal.Enabled = bEstado;
            cboMoneda.Enabled = bEstado;
            txtIGV.Enabled = bEstado;
            txtTotal.Enabled = bEstado;
            txtRetenciones.Enabled = bEstado;
            txtObservaciones.Enabled = bEstado;
            txtPagadoPor.Enabled = bEstado;
            txtNroPago.Enabled = bEstado;
            txtMontoPago.Enabled = bEstado;
            txtFechaPago.Enabled = bEstado;
        }

        private void LimpiarCampos()
        {
            txtRecibo.Text = "";
            txtRazonSocial.Text = "";
            cboTipoRecibo.SelectedValue = "-1";
            txtFechaEmision.Text = "";
            txtFechaVence.Text = "";
            txtFechaRecepcion.Text = "";
            txtSubTotal.Text = "";
            cboMoneda.SelectedValue = "-1";
            txtIGV.Text = "";
            txtTotal.Text = "";
            txtRetenciones.Text = "";
            txtObservaciones.Text = "";
            txtPagadoPor.Text = "";
            txtNroPago.Text = "";
            txtMontoPago.Text = "";
            txtFechaPago.Text = "";
        }

        protected void btnSiGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidarInformacion())
                {
                    var oEntRecibo = new ReciboServicioInfo
                        {
                            RucProveedor = txtProveedor.Text,
                            NroRecibo = txtRecibo.Text,
                            IdTipoServicio = cboTipoRecibo.SelectedValue,
                            FechaRecibo = DateTime.Parse(txtFechaEmision.Text),
                            FechaVencimiento = DateTime.Parse(txtFechaVence.Text),
                            FechaRecepcion = DateTime.Parse(txtFechaRecepcion.Text),
                            IdMoneda = cboMoneda.SelectedValue,
                            SubTotal = Double.Parse(txtSubTotal.Text),
                            Igv = Double.Parse(txtIGV.Text),
                            Total = Double.Parse(txtTotal.Text),
                            Retenciones =
                                String.IsNullOrEmpty(txtRetenciones.Text) ? 0.0 : Double.Parse(txtRetenciones.Text),
                            Observaciones = txtObservaciones.Text,
                            PagadoPor = txtPagadoPor.Text,
                            FechaPago = String.IsNullOrEmpty(txtFechaPago.Text) ? (DateTime?) null : DateTime.Parse(txtFechaPago.Text),
                            NroPago = txtNroPago.Text,
                            MontoPago = String.IsNullOrEmpty(txtMontoPago.Text) ? 0.0 : Double.Parse(txtMontoPago.Text),
                            IdLocal = txtIdLocal.Text,
                            IdUsuarioSistema = Context.User.Identity.Name
                        };

                    if (hfAccion.Value.Equals("N"))
                    {
                        if (new ReciboServicio().Registrar(oEntRecibo))
                        {
                            Util.Util.AlternarMensaje(true, "Se registró el recibo con éxito.", alertaError, alertaExito,
                                                      lblError, lblExito);
                            CargarRecibo(txtRecibo.Text, txtProveedor.Text);
                        }
                        else
                        {
                            Util.Util.AlternarMensaje(false, "No se registró el recibo.", alertaError, alertaExito, lblError, lblExito);
                        }
                    }
                    if (hfAccion.Value.Equals("M"))
                    {
                        if (new ReciboServicio().Actualizar(oEntRecibo))
                        {
                            Util.Util.AlternarMensaje(true, "Se actualizó el recibo con éxito.", alertaError, alertaExito,
                                                      lblError, lblExito);
                            CargarRecibo(txtRecibo.Text, txtProveedor.Text);
                        }
                        else
                        {
                            Util.Util.AlternarMensaje(false, "No se actualizó el recibo.", alertaError, alertaExito, lblError, lblExito);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió el siguiente error: " + ex.Message, alertaError, alertaExito,
                                  lblError, lblExito);
            }
        }

        private void CargarRecibo(String sNroRecibo, String sRucProveedor)
        {
            try
            {
                var oEntRecibo = new ReciboServicioInfo(sNroRecibo, sRucProveedor, null, null, null, null, null);
                oEntRecibo = new ReciboServicio().Consultar(oEntRecibo);

                if (oEntRecibo.NroRecibo != null)
                {
                    txtProveedor.Text = oEntRecibo.RucProveedor;
                    txtRazonSocial.Text = oEntRecibo.Proveedor.RazonSocial;
                    txtRecibo.Text = oEntRecibo.NroRecibo;
                    cboTipoRecibo.SelectedValue = oEntRecibo.IdTipoServicio;
                    if (oEntRecibo.FechaRecibo != null)
                        txtFechaEmision.Text = oEntRecibo.FechaRecibo.Value.ToShortDateString();
                    if (oEntRecibo.FechaVencimiento != null)
                        txtFechaVence.Text = oEntRecibo.FechaVencimiento.Value.ToShortDateString();
                    if (oEntRecibo.FechaRecepcion != null)
                        txtFechaRecepcion.Text = oEntRecibo.FechaRecepcion.Value.ToShortDateString();
                    txtIdLocal.Text = oEntRecibo.IdLocal;
                    txtNombreLocal.Text = oEntRecibo.Local.Descripcion;
                    cboMoneda.SelectedValue = oEntRecibo.IdMoneda;
                    txtSubTotal.Text = String.Format("{0:0.00}", oEntRecibo.SubTotal);
                    txtIGV.Text = String.Format("{0:0.00}", oEntRecibo.Igv);
                    txtTotal.Text = String.Format("{0:0.00}", oEntRecibo.Total);
                    txtRetenciones.Text = String.Format("{0:0.00}", oEntRecibo.Retenciones);
                    txtObservaciones.Text = oEntRecibo.Observaciones;
                    txtPagadoPor.Text = oEntRecibo.PagadoPor;
                    if (oEntRecibo.FechaPago != null)
                        txtFechaPago.Text = oEntRecibo.FechaPago.Value.ToShortDateString();
                    txtNroPago.Text = oEntRecibo.NroPago;
                    txtMontoPago.Text = String.Format("{0:0.00}", oEntRecibo.MontoPago);

                    ActivarDesactivarCampos(false);
                }
                else
                {
                    Util.Util.AlternarMensaje(false, "No se encontró el recibo indicado.", alertaError, alertaExito, lblError, lblExito);
                }
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió el siguiente error: " + ex.Message, alertaError, alertaExito,
                                  lblError, lblExito);
            }
        }

        private bool ValidarInformacion()
        {
            if (String.IsNullOrEmpty(txtProveedor.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar el proveedor del recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (String.IsNullOrEmpty(txtRecibo.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar el número del recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (String.IsNullOrEmpty(txtIdLocal.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar el local al que corresponde el recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (cboTipoRecibo.SelectedValue.Equals("-1"))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar el tipo de servicio del recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (String.IsNullOrEmpty(txtFechaEmision.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar la fecha de emisión del recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (String.IsNullOrEmpty(txtFechaVence.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar la fecha de vencimiento del recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (String.IsNullOrEmpty(txtFechaRecepcion.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar la fecha de recepción del recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!Util.Util.EsFechaValida(txtFechaEmision.Text))
            {
                Util.Util.AlternarMensaje(false, "La fecha de emisión del recibo no tiene un formato válido. Debe ser dd/mm/yyyy.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!Util.Util.EsFechaValida(txtFechaVence.Text))
            {
                Util.Util.AlternarMensaje(false, "La fecha de vencimiento del recibo no tiene un formato válido. Debe ser dd/mm/yyyy.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!Util.Util.EsFechaValida(txtFechaRecepcion.Text))
            {
                Util.Util.AlternarMensaje(false, "La fecha de recepción del recibo no tiene un formato válido. Debe ser dd/mm/yyyy.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (cboMoneda.SelectedValue.Equals("-1"))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar la moneda del importe del recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (String.IsNullOrEmpty(txtSubTotal.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar el subtotal del recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (String.IsNullOrEmpty(txtIGV.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar el IGV del recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (String.IsNullOrEmpty(txtTotal.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar el importe total del recibo.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!Util.Util.EsNumerico(txtSubTotal.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe ingresar un importe de subtotal válido.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!Util.Util.EsNumerico(txtIGV.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe ingresar un importe de IGV válido.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!Util.Util.EsNumerico(txtTotal.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe ingresar un importe total válido.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!String.IsNullOrEmpty(txtRetenciones.Text) && !Util.Util.EsNumerico(txtRetenciones.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe ingresar un importe de retenciones válido.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!String.IsNullOrEmpty(txtMontoPago.Text) && !Util.Util.EsNumerico(txtMontoPago.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe ingresar un monto de pago válido.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!String.IsNullOrEmpty(txtFechaPago.Text) && !Util.Util.EsFechaValida(txtFechaPago.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe ingresar una fecha de pago válida. Debe ser dd/mm/yyyy.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            return true;
        }

        protected void btnConsultarProveedor_Click(object sender, EventArgs e)
        {
            try
            {
                String sRucProveedor = String.IsNullOrEmpty(txtRucProveedorC.Text.Trim())
                                           ? null
                                           : txtRucProveedorC.Text.Trim();
                String sRazonSocial = String.IsNullOrEmpty(txtRazonSocialC.Text.Trim())
                                          ? null
                                          : txtRazonSocialC.Text.Trim();

                gvConsultaProveedor.DataSource = new Proveedor().Listar(new ProveedorInfo(sRucProveedor, sRazonSocial));
                gvConsultaProveedor.DataBind();
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió el siguiente error: " + ex.Message, alertaError, alertaExito,
                                  lblError, lblExito);
            }
        }

        protected void gvConsultaProveedor_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                int index = Convert.ToInt32(e.CommandArgument);
                var dataKey = gvConsultaProveedor.DataKeys[index];
                String sRucProveedor = "";
                if (dataKey != null)
                {
                    sRucProveedor = dataKey.Value.ToString();
                }

                if (e.CommandName.Equals("Seleccionar"))
                {
                    var oEntProveedor = new Proveedor().Consultar(new ProveedorInfo(sRucProveedor, null));
                    txtProveedor.Text = oEntProveedor.RucProveedor;
                    txtRazonSocial.Text = oEntProveedor.RazonSocial;

                    var sb = new StringBuilder();
                    sb.Append(@"<script type='text/javascript'>");
                    sb.Append("$('#modalBusquedaProveedor').modal('hide');");
                    sb.Append(@"</script>");
                    ClientScript.RegisterStartupScript(GetType(), "Hide", sb.ToString());
                    ScriptManager.RegisterClientScriptBlock(this, GetType(), "ModalScript", sb.ToString(), false);
                }
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió un error: " + ex.Message, alertaError, alertaExito, lblError, lblExito);
            }
        }

        protected void btnBuscarProveedor_Click(object sender, EventArgs e)
        {
            gvConsultaProveedor.DataSource = null;

            var sb = new StringBuilder();
            sb.Append(@"<script type='text/javascript'>");
            sb.Append("$('#modalBusquedaProveedor').modal('show');");
            sb.Append(@"</script>");
            ClientScript.RegisterStartupScript(GetType(), "Show", sb.ToString());
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "ModalScript", sb.ToString(), false);
        }

        protected void btnBuscarLocal_Click(object sender, EventArgs e)
        {
            cboTipoLocalConsulta.SelectedValue = "-1";
            gvConsultaLocal.DataSource = null;

            var sb = new StringBuilder();
            sb.Append(@"<script type='text/javascript'>");
            sb.Append("$('#modalConsultaLocal').modal('show');");
            sb.Append(@"</script>");
            ClientScript.RegisterStartupScript(GetType(), "Show", sb.ToString());
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "ModalScript", sb.ToString(), false);
        }

        protected void btnConsultarLocal_Click(object sender, EventArgs e)
        {
            String sIdLocalConsulta = String.IsNullOrEmpty(txtIdLocalConsulta.Text.Trim())
                  ? null
                  : txtIdLocalConsulta.Text.Trim();
            String sDescripcionConsulta = String.IsNullOrEmpty(txtDescripcionConsulta.Text.Trim())
                                          ? null
                                          : txtDescripcionConsulta.Text.Trim();
            String sTipoLocalConsulta = cboTipoLocalConsulta.Items.Count < 1 ||
                                        String.IsNullOrEmpty(cboTipoLocalConsulta.SelectedValue) ||
                                        cboTipoLocalConsulta.SelectedValue.Equals("-1")
                                            ? null
                                            : cboTipoLocalConsulta.SelectedValue;

            gvConsultaLocal.DataSource = new Local().Listar(new LocalInfo(sIdLocalConsulta, sDescripcionConsulta, sTipoLocalConsulta));
            gvConsultaLocal.DataBind();
        }

        protected void gvConsultaLocal_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                int index = Convert.ToInt32(e.CommandArgument);
                var dataKey = gvConsultaLocal.DataKeys[index];
                String sIdLocal = "";
                if (dataKey != null)
                {
                    sIdLocal = dataKey.Value.ToString();
                }
                if (e.CommandName.Equals("Seleccionar"))
                {
                    var oEntLocal = new LocalInfo(sIdLocal, null, null);
                    oEntLocal = new Local().Consultar(oEntLocal);

                    txtIdLocal.Text = oEntLocal.IdLocal;
                    txtNombreLocal.Text = oEntLocal.Descripcion;

                    var sb = new StringBuilder();
                    sb.Append(@"<script type='text/javascript'>");
                    sb.Append("$('#modalConsultaLocal').modal('hide');");
                    sb.Append(@"</script>");
                    ClientScript.RegisterStartupScript(GetType(), "Hide", sb.ToString());
                    ScriptManager.RegisterClientScriptBlock(this, GetType(), "ModalScript", sb.ToString(), false);
                }


            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió un error: " + ex.Message, alertaError, alertaExito, lblError, lblExito);
            }
        }

        protected void btnBuscarRecibo_Click(object sender, EventArgs e)
        {
            //CargarRecibo("123-12342","20269985900");
            gvConsultaProveedor.DataSource = null;
            //UpdatePanel4.Update();

            var sb = new StringBuilder();
            sb.Append(@"<script type='text/javascript'>");
            sb.Append("$('#modalConsultaRecibo').modal('show');");
            sb.Append(@"</script>");
            ClientScript.RegisterStartupScript(GetType(), "Show", sb.ToString());
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "ModalScript", sb.ToString(), false);
        }

        protected void gvConsultaRecibo_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                int index = Convert.ToInt32(e.CommandArgument);
                var dataKey = gvConsultaRecibo.DataKeys[index];
                String sNroRecibo = "";
                String sRucProveedor = "";

                if (dataKey != null)
                {
                    if (dataKey.Values != null)
                    {
                        sNroRecibo = dataKey.Values[0].ToString();
                        sRucProveedor = dataKey.Values[1].ToString();
                    }
                    
                }

                if (e.CommandName.Equals("Seleccionar"))
                {
                    CargarRecibo(sNroRecibo, sRucProveedor);
                    ActivarDesactivarCampos(false);

                    var sb = new StringBuilder();
                    sb.Append(@"<script type='text/javascript'>");
                    sb.Append("$('#modalConsultaRecibo').modal('hide');");
                    sb.Append(@"</script>");
                    ClientScript.RegisterStartupScript(GetType(), "Hide", sb.ToString());
                    ScriptManager.RegisterClientScriptBlock(this, GetType(), "ModalScript", sb.ToString(), false);
                }
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió un error: " + ex.Message, alertaError, alertaExito, lblError, lblExito);
            }
        }

        protected void btnConsultarRecibo_Click(object sender, EventArgs e)
        {
            String sIdLocal = String.IsNullOrEmpty(txtLocalC.Text.Trim()) ? null : txtLocalC.Text.Trim();
            String sRuc = String.IsNullOrEmpty(txtProveedorC.Text.Trim())
                                   ? null
                                   : txtProveedorC.Text.Trim();
            String sRecibo = String.IsNullOrEmpty(txtReciboC.Text.Trim()) ? null : txtReciboC.Text.Trim();
            DateTime? dFechaEmisionDesde;
            DateTime? dFechaEmisionHasta;
            DateTime? dFechaVenceDesde;
            DateTime? dFechaVenceHasta;

            if (String.IsNullOrEmpty(txtFechaEmisionDesde.Text.Trim()))
                dFechaEmisionDesde = null;
            else
                dFechaEmisionDesde = DateTime.Parse(txtFechaEmisionDesde.Text.Trim());

            if (String.IsNullOrEmpty(txtFechaEmisionHasta.Text.Trim()))
                dFechaEmisionHasta = null;
            else
                dFechaEmisionHasta = DateTime.Parse(txtFechaEmisionHasta.Text.Trim());

            if (String.IsNullOrEmpty(txtFechaVenceDesde.Text.Trim()))
                dFechaVenceDesde = null;
            else
                dFechaVenceDesde = DateTime.Parse(txtFechaVenceDesde.Text.Trim());

            if (String.IsNullOrEmpty(txtFechaVenceHasta.Text.Trim()))
                dFechaVenceHasta = null;
            else
                dFechaVenceHasta = DateTime.Parse(txtFechaVenceHasta.Text.Trim());

            gvConsultaRecibo.DataSource =
                new ReciboServicio().Listar(new ReciboServicioInfo(sRecibo, sRuc, dFechaEmisionDesde, dFechaEmisionHasta,
                                                                   dFechaVenceDesde,
                                                                   dFechaVenceHasta, sIdLocal));
            gvConsultaRecibo.DataBind();
        }
    }
}